﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

using MultiGed2.Topologie;

namespace MultiGed2.Provoz
{
 public class KrokJR
 {
  public Dopravna dopravna;
  public byte jdDo;
  public short pobyt;
  public KrokJR() { }
  public KrokJR(Dopravna dop, byte jd, short pob)
  {
   dopravna = dop;
   jdDo = jd;
   pobyt = pob;
  }

  /// <summary>
  /// Nacte krok z textu.
  /// </summary>
  /// <param name="_raw">Zdrojovy text jako reference,
  /// pri uspechu nacteny blok "ukousne".</param>
  /// <returns>True pri uspechu.</returns>
  public bool fromString(ref string _raw, Oblast oblast)
  {
   bool r = false;
   byte l = (byte)_raw.Length;
   byte c = (byte)(l / 5),
    t = 0; // t je pocet znaku, ktere se ukousnou z _raw
   if (l % 5 == 0 && c > 0)
   {
    char kod = _raw[0];
    var dop = oblast.dopravny.Where(d => d.kod == kod);
    if (dop.Count() > 1)
     dop = dop.Where(d => d.kategorie != KategorieDopravny.Pomocna);
    if (dop.Count() > 0)
    {
     dopravna = dop.First();
     // Je-li nezbytné definovat v úvraťové nebo přepřahací stanici delší pobyt než 99 minut,
     // od verze 3.11 je možné tak učinit následným postupem: kód stanice se zopakuje,
     // za něj se zapíše požadovaný pobyt čtyřmi znaky. Zapsaný pobyt za prvním výskytem kódu
     // je pak programem ignorován. Příklad: úvrať a pobyt ve stanici C 110 minut:
     // ....B0801C0700C0110... (jízdní doba do stanice C je 7 minut, pobyt 110 minut)
     if (c > 1 && _raw[0] == _raw[5])
     {
      jdDo = Convert.ToByte(_raw.Substring(1, 2));
      pobyt = Convert.ToInt16(_raw.Substring(6, 4));
      t = Convert.ToByte(_raw.Substring(3, 2));
      if (t == 0)
      {
       t = 10;
       r = true;
      }
     }
     else
     {
      jdDo = Convert.ToByte(_raw.Substring(1, 2));
      pobyt = Convert.ToInt16(_raw.Substring(3, 2));
      t = 5;
      r = true;
     }
    }
   }
   if (t > 0)
    _raw = _raw.Substring(t);
   return r;
  }

  public override string ToString()
  {
   return dopravna.ToString();
  }
 }
}
